/**
 * 输入验证工具
 */

/**
 * 验证必填字段
 * @param {Object} data - 要验证的数据
 * @param {Array} requiredFields - 必填字段数组
 * @returns {Object} 验证结果
 */
const validateRequired = (data, requiredFields) => {
    const missing = [];
    
    for (const field of requiredFields) {
        if (!data[field] || (typeof data[field] === 'string' && data[field].trim() === '')) {
            missing.push(field);
        }
    }
    
    return {
        isValid: missing.length === 0,
        missingFields: missing,
        message: missing.length > 0 ? `缺少必填字段: ${missing.join(', ')}` : null
    };
};

/**
 * 验证邮箱格式
 * @param {string} email - 邮箱地址
 * @returns {boolean} 是否有效
 */
const validateEmail = (email) => {
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return emailRegex.test(email);
};

/**
 * 验证手机号格式
 * @param {string} mobile - 手机号
 * @returns {boolean} 是否有效
 */
const validateMobile = (mobile) => {
    const mobileRegex = /^1[3-9]\d{9}$/;
    return mobileRegex.test(mobile);
};

/**
 * 验证密码强度
 * @param {string} password - 密码
 * @returns {Object} 验证结果
 */
const validatePassword = (password) => {
    if (!password || password.length < 6) {
        return {
            isValid: false,
            message: '密码长度至少6位'
        };
    }
    
    if (password.length > 20) {
        return {
            isValid: false,
            message: '密码长度不能超过20位'
        };
    }
    
    return {
        isValid: true,
        message: '密码格式正确'
    };
};

/**
 * 验证用户名格式
 * @param {string} username - 用户名
 * @returns {Object} 验证结果
 */
const validateUsername = (username) => {
    if (!username || username.length < 3) {
        return {
            isValid: false,
            message: '用户名长度至少3位'
        };
    }
    
    if (username.length > 20) {
        return {
            isValid: false,
            message: '用户名长度不能超过20位'
        };
    }
    
    const usernameRegex = /^[a-zA-Z0-9_]+$/;
    if (!usernameRegex.test(username)) {
        return {
            isValid: false,
            message: '用户名只能包含字母、数字和下划线'
        };
    }
    
    return {
        isValid: true,
        message: '用户名格式正确'
    };
};

/**
 * 验证ID格式
 * @param {string|number} id - ID
 * @returns {boolean} 是否有效
 */
const validateId = (id) => {
    if (!id && id !== 0) return false;
    // 允许字符串形式的数字，先转换为数字再验证
    const numId = Number(id);
    return !isNaN(numId) && numId > 0 && Number.isInteger(numId);
};

/**
 * 验证分页参数
 * @param {Object} params - 分页参数
 * @returns {Object} 验证结果
 */
const validatePagination = (params) => {
    const { page = 1, pageSize = 10 } = params;
    
    const pageNum = Number(page);
    const pageSizeNum = Number(pageSize);
    
    if (isNaN(pageNum) || pageNum < 1) {
        return {
            isValid: false,
            message: '页码必须是大于0的整数'
        };
    }
    
    if (isNaN(pageSizeNum) || pageSizeNum < 1 || pageSizeNum > 100) {
        return {
            isValid: false,
            message: '每页数量必须是1-100之间的整数'
        };
    }
    
    return {
        isValid: true,
        data: {
            page: pageNum,
            pageSize: pageSizeNum,
            offset: (pageNum - 1) * pageSizeNum
        }
    };
};

/**
 * 验证数组参数
 * @param {Array} arr - 数组
 * @param {string} name - 参数名称
 * @returns {Object} 验证结果
 */
const validateArray = (arr, name = '数组') => {
    if (!Array.isArray(arr)) {
        return {
            isValid: false,
            message: `${name}必须是数组格式`
        };
    }
    
    if (arr.length === 0) {
        return {
            isValid: false,
            message: `${name}不能为空`
        };
    }
    
    return {
        isValid: true,
        message: `${name}格式正确`
    };
};

module.exports = {
    validateRequired,
    validateEmail,
    validateMobile,
    validatePassword,
    validateUsername,
    validateId,
    validatePagination,
    validateArray
};